<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			pre{
				font-size: 20px;
			}
		</style>
	</head>
	<body>
		<pre>
	对象与数组
	什么是对象，其实就是一种数据类型，即引用类型。
而对象的值就是引用类型的实例。
对象是拥有属性和方法的数据。
获取对象的属性或方法
	1.对象名.键名
	2.对象名["键名"]
		写入对象属性或方法
		1.对象名.键名 = 键值;
		2.对象名["键名"] = 键值;
		对象在书写时
			1.所有的信息被{}进行包裹
			2.储存形式以键值对形式进行储存   例 键名:键值
			3.每一条信息以逗号分隔
			4.键名一般情况下不需要加引号  直接书写;
			5.当键名为关键字或保留字或为不符合命名标准的字符时   键名需加引号
	通常情况下，不建议在属性名上面加引号（这也能减少一些输入），但在以下这些情境中，引号是必须的：
       1、如果属性名是javascript中的保留字(关键字)之一的话。例如（if,else,return等）
       2、如果属性名中包含空格或其他特殊字符的话（包括任何除字母、数字及下划线以外的字符）。
       3、如果属性名以数字开头的话。
      总而言之，如果我们所选的属性名不符合javascript中的变量命名规则，就必须对其施加一对引号。

//创建对象
1.字面量表示法;2.new运算符;
		fgx("1.字面量表示法");
		var people={
			name:"张三",
			age:28
		}
		console.log("people:",people);
		
		//2.new运算符
		function Person(name,age){
			console.log("this:",this);
			this.name=name;
			this.age=age;
		}
		var zs=new Person("zhangSan",18);
		console.log("zs",zs);
//delete 用于删除对象的某个属性
		var objDelete={
			n1:1,
			n2:2,
			n3:3,
			n4:4,
			n5:5
		}
		//delete 用于删除对象的某个属性
		console.log("objDelete:",objDelete);
		delete objDelete.n1;
		delete objDelete["n2"];
		console.log("objDelete:",objDelete);		
3.访问对象属性
通常情况下，我们可以通过以下两种方式来访问对象的属性：
        1、一种是中括号表示法，例如hero[‘name’]
        2、另一种则是点号表示法，例如 hero.name
        尽管相对而言，点号表示法更易于读写，但也不是总能适用的。
        其中的规则与属性命名原则相同，即如果我们所访问的属性没有一个合法的名字，
        它就不能通过点号表示法来访问。
       如果我们访问的属性不存在，代码就会返回undefined.
    
    fgx("3.访问对象属性");
		var obj={
			n1:1,
			n2:2,
			n3:3,
			speak:function(){
				console.log("我们老师真帅!");
			}
		}
		console.log(obj.n1);
		console.log(obj["n1"]);
		console.log(obj["n5"],obj.n5);
    
    4.调用对象方法
    由于对象方法实际上只是一个函数类型属性，因此它们的访问方式与属性完全相同，即用点号表示法或中括号表示法均可。
    而其调用（请求）方式也与其他函数相同，在指定的方法名后加一对括号即可
		obj.speak();
		obj["speak"]();
	5.修改对象属性和方法
由于JavaScript是一种动态的语言，所以它允许我们随时对现存对象的属性和方法进行修改。其中自然也包括添加与删除属性。因此，我们也可以
先创建一个空对象，稍后再为它添加属性。
	var person={
			name:"wd"
		}
		console.log("person",person,"person.name:",person.name);
		//修改对象属性
		person.name="wangdong";
		console.log("person",person,"person.name:",person.name);
		//为对象添加属性
		person.age=18;
		console.log("person",person,"person.name:",person.name,"person.age:",person.age);
		//删除对象属性
		delete person.age;
		console.log("person",person,"person.name:",person.name,"person.age:",person.age);
		//删除对象
		person=null;
		console.log(person);	
		
	6、Object.defineProperty()
	Object.defineProperty()的作用就是直接在一个对象上定义一个新属性，或者修改一个已经存在的属性
	我们经常使用对象的定义与赋值方法obj.prop =value或者obj['prop']=value；
	let Person = {};
	Person.name = "王东";
	Person['age'] = 18;
	console.log(Person.name);
	console.log(Person.age);
	
	Object.defineProperty(obj, prop, desc);
	1.obj 需要定义属性的当前对象
	2.prop 当前需要定义的属性名
	3.desc 属性描述符
	一般通过为对象的属性赋值的情况下，对象的属性可以修改也可以删除，但是通过
	Object.defineProperty()定义属性，通过描述符的设置可以进行更精准的控制对象属性。
	
	var obj={
		name:"张三",
		age:88,
		sex:"男"
	};
	obj.name="李四";
	//                   修改的对象   属性
	Object.defineProperty(   obj,   "name",{
		value:"老王",//修改的值
		writable:false,//能否被修修改,
		configurable:false,//能否被删除
		enumerable: false ,//是否可以被枚举---遍历 
	})
	
	
	var Person = {
		name: "李俊峰",
		age: 25
	};
	// 设置对象属性的方法
	var temp = null;
	Object.defineProperty(Person, "name", {
		get: function() {
			return temp;
		},
		set: function(val) {
			//console.log(val);
			temp = val;
		},
		//writable:false,//能否被修修改,
		configurable:false,//能否被删除
		enumerable: false ,//是否可以被枚举---遍历 
	});
	Person.name = "王东";
	console.log('------------',Person.name);
	<!--<script>
		var Person = {
		name: "李俊峰",
		age: 25
	};
	var temp = null;
	Object.defineProperty(Person, "name", {
		get: function() {
			return temp;
		},
		set: function(val) {
			//console.log(val);
			temp = val;
		},
		//writable:false,//能否被修修改,
		configurable:false,//能否被删除
		enumerable: false ,//是否可以被枚举---遍历 
	});
	Person.name = "王东";
	console.log('------------',Person.name);
	</script>-->

	在一些程序设计语言中，通常都会存在着两种不同的数组形式：
	1、一般性数组，也叫做索引型数组或者枚举型数组（通常以数字为键值）
	2、关联型数组，也叫做哈希表（通常以字符串为键值）。 
			
		//哈希数组
		/*
		 * 它的索引为自定义索引   并非为一般数组中0-正无穷的整数
		 * 哈希项不占数组长度
		 * 哈希项不可使用数组的方法
		 * 获取值时和对象获取值方法类似   数组名[“自定义索引”]
		 * 写入值时和对象写入值方法类似   数组名[“自定义索引”] = 值；
		 * 删除方法和对象删除一样     delete 数组名["自定义索引"]
		 * 通过for in 遍历哈希数组
		 */
		
		fgx("2.关联型数组,哈希表");
		var arr=[];
		//写入
		arr["a"]="1";
		arr["b"]="2";
		arr["c"]="3";
		arr["d"]="4";
		arr["e"]="5";
		console.log("arr:",arr);
		
		arr.pop();//无效
		
		console.log("arr:",arr);
		
		//删除
		delete arr["a"];
		delete arr.b;
		console.log("arr:",arr);
		
		for(var o in arr){
			console.log(o,arr[o]);
		}		
		
		
		</pre>
		<script>
		fgx("1.一般性数组");	
		var arr0=[2,4,6,8,0];
		for(var a in arr){
			console.log("a:",a,"arr["+a+"]:",arr[a]);
		}
		
		fgx("2.关联型数组,哈希表");
		var arr=[];
		//写入
		arr["a"]="1";
		arr["b"]="2";
		arr["c"]="3";
		arr["d"]="4";
		arr["e"]="5";
		console.log("arr:",arr);
		
		arr.pop();//无效
		
		console.log("arr:",arr);
		
		//删除
		delete arr["a"];
		delete arr.b;
		console.log("arr:",arr);
		delete arr;
		console.log("arr:",arr);//只能删除对象属性,不能删除对象 arr=null;
		
		for(var o in arr){
			console.log(o,arr[o]);
		}
		
		fgx("3.访问对象属性");
		var obj={
			n1:1,
			n2:2,
			n3:3,
			speak:function(){
				console.log("我们老师真帅!");
			}
		}
		console.log(obj.n1);
		console.log(obj["n1"]);
		console.log(obj["n5"],obj.n5);
		fgx("4.调用对象方法");
		obj.speak();
		fgx();
		obj["speak"]();
		
		fgx("5.修改对象属性和方法");
		
		var person={
			name:"kky"
		}
		console.log("person",person,"person.name:",person.name);
		//修改对象属性
		person.name="ldw";
		console.log("person",person,"person.name:",person.name);
		//为对象添加属性
		person.age=18;
		console.log("person",person,"person.name:",person.name,"person.age:",person.age);
		//删除对象属性
		delete person.age;
		console.log("person",person,"person.name:",person.name,"person.age:",person.age);
		//删除对象
		person=null;
		console.log(person);
		
		
		function fgx(str){
			str==undefined?str="":str;
			console.log(str+"--------------------------");
		}
		</script>
	</body>
</html>
